/*
 * GuudBitSet.cpp
 *
 *  Created on: 2013-1-19
 *      Author: heqiu
 */

#include "GuudBitSet.h"

namespace guud {
GuudBitSet::GuudBitSet() {
	m_uiSize = 0;
	m_pArray = NULL;
	m_bFlag = false;
}
GuudBitSet::~GuudBitSet() {
	if (m_pArray != NULL) {
		delete[] m_pArray;
		m_pArray = NULL;
	}
}
void GuudBitSet::init(uint32_t uiSize, bool bFlag) {
	m_uiSize = uiSize;
	uint32_t uiSet = m_uiSize / 64 + 1;
	m_pArray = new std::bitset<64>[uiSet];
	if (bFlag) {
		for (uint32_t ui = 0; ui < uiSet; ui++) {
			m_pArray[ui].flip();
		}
	}
	m_bFlag = bFlag;
}
bool GuudBitSet::setBit(uint32_t uiPos, bool bFlag) {
	if (uiPos < m_uiSize) {
		uint32_t uiNo = uiPos / 64;
		uint32_t uiKey = uiPos % 64;
		if (bFlag) {
			m_pArray[uiNo].set(uiKey);
		} else {
			m_pArray[uiNo].reset(uiKey);
		}
		return true;
	}
	return false;
}
bool GuudBitSet::getBit(uint32_t uiPos) {
	if (uiPos < m_uiSize) {
		uint32_t uiNo = uiPos / 64;
		uint32_t uiKey = uiPos % 64;
		return m_pArray[uiNo][uiKey];
	}
	return m_bFlag;
}
void GuudBitSet::reset(bool bFlag) {
	uint32_t uiSet = m_uiSize / 64 + 1;
	if (m_pArray != NULL) {
		for (uint32_t ui = 0; ui < uiSet; ui++) {
			m_pArray[ui].reset();
			if (bFlag) {
				m_pArray[ui].flip();
			}
		}
	}
	m_bFlag = bFlag;
}

}

